﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Common.Extensions;

namespace ContactManagement.AppCode.HtmlHelperForViews
{
    /// <summary>
    /// Erstellt einen Link für eine Spalte im Tabellenkopf, der die Sortierung nach dieser Spalte veranlasst, wenn die Liste die angezeigt wird
    /// mittels der ExtensionMethode OrderByUrlParams sortiert wurde.
    /// z.B.: @Html.TableHeaderLinks("UserTitle", Resources.AccountViews.TitleRESX).CreateSortLink()
    /// Der Typ des Properties nach dem sortiert werden soll kann auch wieder ein Benutzerdefinierter Typ sein, hier muss nur IComparable definiert werden für den Typen.
    /// </summary>
    public class SortLinksHtmlHelper
    {
         #region Member
        private readonly HtmlHelper CurrentHtmlHelper;
        private string ActionName { get; set; }
        private string SortName { get; set; }
        private string LinkName { get; set; }
        #endregion

        #region Konstruktor
        /// <summary>
        /// Konstruktor der HTML Helpers Klasse für die Kategorien, die Statische Klasse zum Instanzieieren findet man in den HtmlHelperExtensions
        /// </summary>
        /// <param name="sortName">Der Name des Properties nach dem sortiert werden</param>
        /// <param name="linkName">Der Name der als Link angezeigt werden soll im Header</param>
        public SortLinksHtmlHelper(HtmlHelper htmlHelper, string sortName, string linkName)
        {
            CurrentHtmlHelper = htmlHelper;
            //Die aktuelle Aktion heraussuchen, die gerade angezeigt wird, da wir die Tabelle sortieren, bleibt die Action gleich und wir können diesen Wert verwenden
            ActionName = CurrentHtmlHelper.ViewContext.RouteData.GetRequiredString(WebConstants.ActionString);
            LinkName = linkName;
            SortName = sortName;
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Erstellen des passenden Links für die Aktuelle Tabelle,dabei wird automatisch angepasst um welche Sortierung es sich dabei handeln soll.
        /// </summary>
        /// <returns>Link zum Sortieren der Spalte der direkt im TabellenHeader eingebunden werden kann.</returns>
        public MvcHtmlString CreateSortLink()
        {
            //Aus der URL den passenden SortType auslesen
            string urlSortType = HttpContext.Current.Request.Params[SortExtensions.UrlSortType];
            string urlSortName = HttpContext.Current.Request.Params[SortExtensions.UrlSortName];
            
            //Standardsortierung ist ASC
            string newSortType = SortExtensions.SortASC;
            //Einstellen des passenden SortTypes für die Spalte anhand der aktuell eingestellten Sortiertyps in der URL.
            //Wird dann genau der andere Sortiertyp genommen und nur für die Spalte einstellen die auch gerade in der URL angezeigt wird.
            if (!string.IsNullOrEmpty(urlSortType) && !string.IsNullOrEmpty(urlSortName) && SortName.ToLower() == urlSortName.ToLower())
            {
                if (urlSortType.ToLower() == SortExtensions.SortASC.ToLower())
                {
                    newSortType = SortExtensions.SortDESC;
                }
                else
                {
                    newSortType = SortExtensions.SortASC;
                }
            }

            //Erstellen des Links mit Hilfe des CurrentHtmlHelpers
            UrlHelper urlHelper = new UrlHelper(CurrentHtmlHelper.ViewContext.RequestContext);
            //Den passen Link zusammenbauen inkl. der aktuellen Aktion die ausgeführt wird und den Sortnamen und Sortype der gesetzt werden soll
            string link = urlHelper.Action(ActionName, new { sortName = SortName, sortType = newSortType });
            
            //Erstellen des gesammten Links inkl. des Linknamen
            string htmlLink = string.Format("<a href=\"{0}\">{1}</a>", link, LinkName);

            //Umwandlen in einen MvcHtmlString, damit das ganze auch richtig dargestellt wird als HTML Code auf der Webseite.
            return MvcHtmlString.Create(htmlLink);
        }
        #endregion
    }
}